package client.gui;

import java.awt.event.*;
import javax.swing.*;

/**
 * 
 * permet la gestion d'une table avec ses chaises
 * 
 */
@SuppressWarnings("serial")
public class TableDeJeu extends ITableDeJeu implements ActionListener,
		choixCartes, infos {
	/**
	 * est la liste des chaises de la tabe
	 */
	private Chaise[] chaises = new Chaise[10];// les chaises de la table
	/**
	 * est la liste des cartes posees sur la table
	 */
	private Carte[] cartes = new Carte[5];
	/**
	 * est le panel parent
	 */
	private IAffichageClient gui;// la fenetre dans laquelle afficher la table
	/**
	 * permet d'afficher le pot sur la table
	 */
	private JLabel pot;
	/**
	 * est l'image du pot
	 */
	private ImageIcon imgJetons;

	/**
	 * permet de construir une table avec des chaises
	 * 
	 * @param gui
	 *            est la fenetre dans laquelle afficher la table
	 */
	public TableDeJeu(IAffichageClient gui) {
		this.gui = gui;
		String joueur[] = { "Al_Capone", "christina_lindley", "clara_morgane",
				"crocodile_dundee", "elsa_fayer", "hulk_hogan",
				"kimberly_lansing", "mao_zedong", "michael_clarke_duncan",
				"patrick_bruel" };
		ClassLoader cldr = this.getClass().getClassLoader();
		java.net.URL imageURL = cldr.getResource("table2.png");
		ImageIcon icon = new ImageIcon(imageURL);
		setIcon(icon);
		int posX = 125, posY = 10;
		setSize(icon.getIconWidth(), icon.getIconHeight());
		for (int i = 0; i < chaises.length; i++) {

			if (i < 4) {
				chaises[i] = new Chaise(this, posX, posY, 270, joueur[i]);
				add(chaises[i]);
				posX += 150;
			}
			if (i == 4) {
				posX -= 15;
				posY += 150;
				chaises[i] = new Chaise(this, posX, posY, 180, joueur[i]);
				add(chaises[i]);
				posX -= 120;
				posY += 150;
			}
			if (i > 4 && i < 9) {
				chaises[i] = new Chaise(this, posX, posY, 90, joueur[i]);
				add(chaises[i]);
				posX -= 150;
			}
			if (i == 9) {
				posX += 20;
				posY -= 150;
				chaises[i] = new Chaise(this, posX, posY, 0, joueur[i]);
				add(chaises[i]);

			}
		}
		for (int i = 0; i < 5; i++) {
			cartes[i] = new Carte();
			add(cartes[i]);
			cartes[i].setVisible(false);
		}
		cartes[0].setLocation(170, 150);
		cartes[1].setLocation(250, 150);
		cartes[2].setLocation(330, 150);
		cartes[3].setLocation(410, 150);
		cartes[4].setLocation(490, 150);
		pot = new JLabel();
		imageURL = cldr.getResource("pot.png");
		imgJetons = new ImageIcon(imageURL);
		pot.setIcon(imgJetons);
		pot.setHorizontalTextPosition(SwingConstants.CENTER);
		pot.setVerticalTextPosition(SwingConstants.BOTTOM);
		add(pot);
		pot.setSize(70, 50);
		pot.setVisible(false);
		pot.setLocation(562, 180);
	}

	/**
	 * permet de pouvoir choisir la chaise si elle est pas deja prise
	 * 
	 * @param choisir
	 *            permet d'activer la possibilite de choisir ou desactive cette
	 *            possibilite
	 */
	public void setChoixChaise(boolean choisir) {
		for (Chaise chaise : chaises) {
			chaise.setChoixChaise(choisir);
		}
	}

	/**
	 * permet de mettre les infos du joueur
	 * 
	 * @param NoChaise
	 *            est le No de la chaise
	 * 
	 * @param nom
	 *            est le pseudo du joueur(nom a "" pour liberer la chaise)
	 * @param montant
	 *            est l'argent qu'il a
	 */
	public void setChaiseInfos(int NoChaise, String nomJoueur, double montant) {
		chaises[NoChaise].setInfos(nomJoueur, montant);
		validate();
		repaint();
	}

	/**
	 * permet d'afficher ou cacher le montant mise
	 * 
	 * @param NoChaise
	 *            est le No de la chaise
	 * 
	 * @param montant
	 *            est le montant mise
	 * @param visible
	 *            permet de l'afficher ou non
	 */
	public void setMontantMise(int NoChaise, double montant, boolean visible) {
		chaises[NoChaise].setMontantMise(montant, visible);
	}

	/**
	 * permet d'afficher le jeton du dealer devant une chaise
	 * 
	 * @param NoChaise
	 *            est le no de la chaise du dealer
	 */
	public void setDealer(int NoChaise) {
		for (int i = 0; i < chaises.length; i++) {
			chaises[i].setDealer(i == NoChaise);
		}
	}

	/**
	 * permet de definir sur quelle chaise le joueur a clique pour s'asseoir et
	 * de transmettre l'info a la fenetre
	 */
	public void actionPerformed(ActionEvent e) {
		
		int No = -1;
		for (int i = 0; i < chaises.length; i++) {
			if (chaises[i] == e.getSource()) {
				No = i;
			}
		}
		gui.chaiseChoisi(No);
	}

	/**
	 * permet de montrer le flop
	 * 
	 * @param carte1
	 *            est le nom de la 1ere carte
	 * @param carte2
	 *            est le nom de la 2emme carte
	 * @param carte3
	 *            est le nom de la 3emme carte
	 */
	public void setFlop(String carte1, String carte2, String carte3) {
		cartes[0].getLocation();
		move(cartes[0], carte1);
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}
		//cartes[0].setVisible(true);
		
		
		cartes[1].getLocation();
		
		move(cartes[1], carte2);
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}
		//cartes[1].setVisible(true);
		cartes[2].getLocation();
		move(cartes[2], carte3);
		//cartes[2].setVisible(true);
		
	}

	/**
	 * permet de montrer la turn
	 * 
	 * @param carte4
	 *            est le nom de la 4emme carte
	 */
	public void setTurn(String carte4) {
		cartes[3].getLocation();
		move(cartes[3], carte4);
		
	}

	/**
	 * permet de montrer la river
	 * 
	 * @param carte5
	 *            est le nom de la 5emme carte
	 */
	public void setRiver(String carte5) {
		cartes[4].getLocation();
		move(cartes[4], carte5);		
	}

	/**
	 * permet l'animation des cartes
	 * 
	 * @param carte
	 *            est la carte a animer
	 * @param nomCarte
	 *            est le nom de la carte
	 * @param depart
	 *            est le point de depart de l'animation
	 * @param arrivee
	 *            est le point d'arrivee de l'animation
	 */
	private void move(Carte carte, String nomCarte) {
		class animation implements Runnable {
			Carte carte;
			String nomCarte;

			public animation(Carte carte, String nomCarte) {
				this.carte = carte;
				this.nomCarte = nomCarte;
			}

			public void run() {
				carte.setImage("ARRIERE", MOYENNE);
				carte.setVisible(true);
				validate();
				repaint();
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				validate();
				carte.setImage(nomCarte, MOYENNE);
				validate();
				repaint();
			}
		}
		new Thread(new animation(carte, nomCarte)).start();
	}

	/**
	 * permet d'enlever de la table les cartes du flop,turn et river
	 */
	public void retirerCartes() {
		for (Carte carte : cartes)
			carte.setVisible(false);
		validate();
		repaint();
	}

	/**
	 * permet de mettre sur le joueur l'action faite
	 * 
	 * @param NoChaise
	 *            est le no du joueur
	 * @param action
	 *            est l'action a afficher
	 */
	public void setAction(int NoChaise, String action) {

		chaises[NoChaise].setAction(action);
	}

	/**
	 * permet d'afficher les cartes d'un joueur
	 * 
	 * @param NoJoueur
	 *            est le joueur en question
	 * @param carte1
	 *            est le nom de la carte 1
	 * @param carte2
	 *            est le nom de la carte 2
	 */
	public void setCartesJoueur(int NoJoueur, String carte1, String carte2) {
		chaises[NoJoueur].setCartes(carte1, carte2);
	}

	/**
	 * permet d'afficher les cartes d'un joueur et de mettre pour tous les
	 * autres joueurs dans la partie le dos des cartes
	 * 
	 * @param NoJoueur
	 *            est le joueur en question
	 * @param carte1
	 *            est le nom de la carte 1
	 * @param carte2
	 *            est le nom de la carte 2
	 */
	public void setCartesJoueurAutomatique(int NoJoueur, String carte1,
			String carte2) {
		for (int i = 0; i < chaises.length; i++) {
			if (i == NoJoueur) {
				chaises[i].setCartes(carte1, carte2);
			} else {
				if (!chaises[i].estLibre()) {
					chaises[i].setCartes("ARRIERE", "ARRIERE");
				}
			}
		}

	}

	/**
	 * permet de retirer les cartes d'un joueur
	 * 
	 * @param NoJoueur
	 *            est le joueur en question
	 */
	public void retirerCartesJoueur(int NoJoueur) {
		chaises[NoJoueur].retirerCartes();
	}

	/**
	 * permet de retirer toutes les cartes des joueurs
	 */
	public void retirerToutesLesCartesJoueur() {
		for (Chaise chaise : chaises)
			chaise.retirerCartes();
	}

	/**
	 * permet de reinitialiser les montants mise
	 */
	public void tourTermine() {
		for (int i = 0; i < chaises.length; i++)
			setMontantMise(i, 0.0, false);

	}

	/**
	 * permet d'afficher le montant mise
	 * 
	 * @param noChaise
	 *            est le no du joueur
	 * @param montant
	 *            est le montant mise
	 */
	public void setMontantRestant(int noChaise, double montant) {
		chaises[noChaise].setMontantRestant(montant);
	}

	/**
	 * permet de modifier et d'afficher le pot
	 * 
	 * @param pot
	 *            est le montant du pot
	 * @param visible
	 *            true pour afficher le pot
	 */
	public void setPot(double pot, boolean visible) {
		this.pot.setText("pot: " + pot + DEVISE);
		this.pot.setVisible(visible);
	}

	/**
	 * permet de savoir combien il y a de cartes sur la table
	 * 
	 * @return le nombre de cartes qu'il y a sur la table
	 */
	public int getNbCartes() {
		int cpt = 0;
		for (int i = 0; i < cartes.length; i++)
			if (cartes[i].isVisible())
				cpt++;
		return cpt;
	}
}
